
package com.thinkgem.jeesite.common.component.redis.element;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;

/** 
 * 放置rds的容器类(hash)元素操作
 *
 */
public class RdsHash {
	
	public RdsHash(Jedis jedis) {
	    super();
	    this.jedis = jedis;
    }

	public Jedis getJedis() {
    	return jedis;
    }

	public void setJedis(Jedis jedis) {
    	this.jedis = jedis;
    }

	/**
	 * hash结构,设置key中指定field的值为value,有相同的field时会直接覆盖
	 * @param key
	 * @param field
	 * @param value
	 * @return
	 * 2014-10-28
	 */
	public Long hset(String key,String field,String value) {
    	return getJedis().hset(key, field, value);
    }

	/**
	 * hash结构,设置key中指定field的值为value,有相同的field时会报错,并直接退出
	 * @param key
	 * @param field
	 * @param value
	 * @return
	 * 2014-10-28
	 */
	public Long hsetnx(String key,String field,String value) {
    	return getJedis().hsetnx(key, field, value);
    }

	/**
	 * hash结构,获取key中指定field的值
	 * @param key
	 * @param field
	 * @return
	 * 2014-10-28
	 */
	public String hget(String key,String field) {
    	return getJedis().hget(key, field);
    }

	/**
	 * hash结构,在一次原子操作中直接设置所有的map数据到指定key中
	 * @param key
	 * @param hash
	 * @return
	 * 2014-10-28
	 */
	public String hmset(String key,Map<String, String> hash) {
    	return getJedis().hmset(key, hash);
    }

	/**
	 * hash结构,获取key中指定所有fields的values值
	 * @param key
	 * @param fields
	 * @return
	 * 2014-10-28
	 */
	public List<String> hmget(String key,String... fields) {
		return getJedis().hmget(key, fields);
	}

	/**
	 * hash结构,在key的指定field中增加指定的value值
	 * (常用于排序)
	 * @param key
	 * @param field
	 * @param value
	 * @return
	 * 2014-10-28
	 */
	public Long hincrBy(String key,String field,Long value) {
		return getJedis().hincrBy(key, field, value);
	}

	/**
	 * hash结构,判断key中指定的field是否存在
	 * @param key
	 * @param field
	 * @return
	 * 2014-10-28
	 */
	public Boolean hexists(String key,String field) {
    	return getJedis().hexists(key, field);
    }

	/**
	 * hash结构,删除key中指定fields的值
	 * @param key
	 * @param fields
	 * @return
	 * 2014-10-28
	 */
	public Long hdel(String key,String... fields) {
    	return getJedis().hdel(key, fields);
    }

	/**
	 * 返回key中field的个数
	 * @param key
	 * @return
	 * 2014-10-28
	 */
	public Long hlen(String key) {
    	return getJedis().hlen(key);
    }

	/**
	 * hash结构,返回key中的所有field集
	 * @param key
	 * @return
	 * 2014-10-28
	 */
	public Set<String> hkeys(String key) {
		return getJedis().hkeys(key);
	}

	/**
	 * hash结构,返回key中的所有value值
	 * @param key
	 * @return
	 * 2014-10-28
	 */
	public List<String> hvals(String key) {
    	return getJedis().hvals(key);
    }

	/**
	 * hash结构,获取key中所有的field和value,并直接返回他们的map结构
	 * @param key
	 * @return
	 * 2014-10-28
	 */
	public Map<String, String> hgetAll(String key) {
    	return getJedis().hgetAll(key);
    }

	/**
	 * hash结构,增量迭代的方式将指定key从游标cursor位置起始进行遍历,并返回下次迭代的数据集合.
	 * (2.8.0的新特性,除了泛型,集合外还有字符结构和基础结构的scan接口.他们都基于scan接口来实现)
	 * (除了scan不需要指定key外,其他的特殊结构都需要指定key.因为scan是将当前库的所有key进行全迭代遍历)
	 * (scan系的接口还会指定模式匹配用的参数match以及迭代用的计数count在不同的接口实现中)
	 * @param key
	 * @param cursor
	 * @return
	 * 2014-10-28
	 */
	public ScanResult<Entry<String, String>> hscan(String key,String cursor) {
    	return getJedis().hscan(key, cursor);
    }

	/**
	 * 同上,增加模式匹配参数
	 * @param key
	 * @param cursor
	 * @param params
	 * @return
	 * 2014-10-28
	 */
	public ScanResult<Entry<String, String>> hscan(String key,String cursor,ScanParams params) {
    	return getJedis().hscan(key, cursor, params);
    }

	private Jedis jedis;//当前客户端
}
